package com.yxh.www.author.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yxh.www.author.domain.SmRole;
import com.yxh.www.author.mapper.SmRoleMapper;
import com.yxh.www.author.service.SmRoleService;
import com.yxh.www.common.result.Result;
import com.yxh.www.common.result.ResultBuilder;
import com.yxh.www.common.result.ResultEnum;
import com.yxh.www.mysql.base.BaseServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

/**
 * <p>
 * 系统角色-RBAC 服务实现类
 * </p>
 *
 * @author Yangxiaohui
 * @since 2020-05-09
 */
@Service
public class SmRoleServiceImpl extends BaseServiceImpl<SmRoleMapper, SmRole> implements SmRoleService {

    /**
     * 新增系统角色
     *
     * @param roleName 角色名称    必填
     * @param roleKey  角色唯一标识  必填 唯一
     * @param remark   备注  非必填
     * @return 统一响应 {@link Result}
     */
    @Override
    public Result<Object> addSmRole(String roleName, String roleKey, String remark) {
        // 判断角色名或标识是否重复
        int countSmRoleByRoleName=baseMapper.selectCount(new QueryWrapper<SmRole>()
                .eq("role_name",roleName)
                .or()
                .eq("role_key",roleKey)
        );
        if (countSmRoleByRoleName>0){
            return ResultBuilder.error(ResultEnum.USER_HANDEL_ERROR,"角色名称或标识已存在！");
        }
        // 持久化
        SmRole smRole=new SmRole(roleName,roleKey,remark);
        smRole.setCreateTime(LocalDateTime.now());
        return smRole.insert()?ResultBuilder.success():ResultBuilder.error(ResultEnum.USER_HANDEL_ERROR,"系统角色新增失败！");
    }

    /**
     * 修改系统角色
     *
     * @param id         角色ID   必填
     * @param roleStatus 角色状态  非必填
     * @param remark     角色备注   非必填
     * @return 统一响应 {@link Result}
     */
    @Override
    public Result<Object> modifySmRole(String id, String roleStatus, String remark) {
        SmRole smRole=new SmRole().setId(id).setRoleStatus(roleStatus).setRemark(remark);
        return smRole.updateById()?ResultBuilder.success():ResultBuilder.error(ResultEnum.USER_HANDEL_ERROR,"系统角色修改失败！");
    }

    /**
     * 根据ID删除系统角色
     *
     * @param ids 角色ID集合
     * @return 统一响应 {@link Result}
     */
    @Override
    public Result<Object> removeSmRole(String... ids) {
        baseMapper.deleteBatchIds(Arrays.asList(ids));
        return ResultBuilder.success();
    }

    /**
     * 查询系统角色列表
     *
     * @param roleName 角色名称    模糊查询
     * @return 统一响应 {@link Result<  List  >} 实体 {@link SmRole}
     */
    @Override
    public Result<List<SmRole>> listSmRole(String roleName) {
        QueryWrapper<SmRole> queryWrapper=new QueryWrapper<>();
        if (StringUtils.isNotBlank(roleName)){
            queryWrapper.like("role_name",roleName);
        }
        return ResultBuilder.success(baseMapper.selectList(queryWrapper));
    }

    /**
     * 分页查询系统角色列表
     *
     * @param roleName 角色名称    模糊查询
     * @param pageNum  页码          默认值 1
     * @param pageSize 页面数据长度    默认值 20
     * @return 统一响应 {@link Result}
     */
    @Override
    public Result<Object> pageSmRole(String roleName, Long pageNum, Long pageSize) {
        QueryWrapper<SmRole> queryWrapper=new QueryWrapper<>();
        if (StringUtils.isNotBlank(roleName)){
            queryWrapper.like("role_name",roleName);
        }
        return ResultBuilder.success(baseMapper.selectPage(new Page<>(pageNum,pageSize),queryWrapper));
    }
}
